package practice;

// 用栈实现队列
// 两个栈实现一个队列！！

import java.util.Stack;

public class MyQueue {
    // 声明定义两个栈
    Stack<Integer> stack1; // 第一个栈专门进元素
    Stack<Integer> stack2; // 第二个栈专门出元素
    // 当第二个栈为空时就将第一个栈中的所有元素都放到第二个栈中！

    // 初始化两个栈！而不是队列
    public MyQueue() {
        // 注意如何进行栈的初始化！！！
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }

    // 压入元素
    public void push(int x) {
        // 第一个转门进元素！
        stack1.push(x);
    }

    // 拿到并删除队列顶元素
    // 第二个栈专门出元素：但是若是空就将一的全部出到二中，若二不空就直接出！
    public int pop() {
        //缺少一个完整判空：空则返回-1
        if(empty()) {
            return -1;
        }
        // 判出的栈空
        if(stack2.empty()) {
            // 如果使用size（） 同样要注意的是：size会变化，所以应该使用临时变量！
            int curSize = stack1.size();
            //for (int i = 0; i < stack1.size(); i++) {
            for (int i = 0; i < curSize; i++) {
                stack2.push(stack1.pop());
            }
            /*
            // 直接用while循环
            while (!stack1.empty()) {
                stack2.push(stack1.pop());
            }*/
        }
        return stack2.pop();
    }

    // 拿到顶但不删除
    public int peek() {
        if(empty()) {
            return -1;
        }
        //来到这儿需要再判断2是否为空，空才要进行1倒过来到2
        if(stack2.empty()) {
            // 直接用while循环
            while (!stack1.empty()) {
                stack2.push(stack1.pop());
            }
        }
        return stack2.peek();
    }

    // 判空：直接判断两个栈是否为空就行
    public boolean empty() {
        return (stack1.empty() && stack2.empty());
    }


    public static void main(String[] args) {
        MyQueue myQueue = new MyQueue();
        System.out.println("进行测试：(先进先出：所以理论是1 2 3 4 5");
        myQueue.push(1);
        myQueue.push(2);
        myQueue.push(3);
        myQueue.push(4);
        System.out.println(myQueue.pop());
        myQueue.push(5);
        System.out.println(myQueue.pop());
        System.out.println(myQueue.pop());
        System.out.println(myQueue.pop());
        System.out.println(myQueue.pop());

        System.out.println("============");
        myQueue.push(1);
        myQueue.push(2);
        System.out.println(myQueue.peek());
        myQueue.push(8);
        System.out.println(myQueue.peek());
        System.out.println(myQueue.empty());
    }
}
